package com.wuji1626.spark.rdd.transform

import org.apache.spark.{SparkConf, SparkContext}

object RDD_Transform_aggregateByKey_zeroValue {

  def main(args: Array[String]): Unit = {
    // Step1: 准备环境
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)
    // Step2: 算子 aggregateByKey
    // 数据分区【("a",1),("a",2)】【("a",3),("a",4)】
    val rdd = sc.makeRDD(List(("a",1),("a",2),("b",3),("b",4),("b",5),("a",6)),numSlices = 2)

    // aggregateByKey() 存在参数柯里化
    // 第一个参数列表, 需要传递一个参数：表示初始值
    // 主要用于当我们遇到第一个 key 时，和 value 进行分区计算
    // 第二个参数列表：
    //    第一个参数表示分区内计算规则
    //    第二个参数表示分区件计算规则
    rdd.aggregateByKey(zeroValue = 5)(
      (x, y) => math.max(x,y),
      (x, y) => x + y
    ).collect().foreach(println)
    // Step3: 关闭环境
    sc.stop()
  }
}
